package org.alvin.dispatchtcp;

import io.netty.buffer.ByteBufUtil;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class DispatchMain {

    public static byte[] convertEndian(byte[] bytes) {
        for (int i = 0; i < bytes.length / 2; i++) {
            byte temp = bytes[i];
            bytes[i] = bytes[bytes.length - i - 1];
            bytes[bytes.length - i - 1] = temp;
        }
        return bytes;
    }

    public static byte[] intToByte2(int src) throws Exception {
        if (src > 65535) throw new Exception("data overflow");
        String intString = String.format("%04x", src);
        return  ByteBufUtil.decodeHexDump(intString) ;
    }
    public static void main(String[] args) {
//        04ceaa40

//        System.out.println(0xceaa40);
//
//        System.out.println(Integer.toHexString(13544000));
        System.out.println(  String.format("%06x", 44000) );

//        byte [] buff = ByteBufUtil.decodeHexDump("444E5913003B37AB04B900207E00021421000000E4009104");
//        int sizes = buff.length;
//        System.out.println("单车网关协议解析：" + ByteBufUtil.hexDump(buff));
//        //如果开头为 FC EE 时
//        if (sizes <= 15) {
//            System.out.println("长度小于15");
//            return ;
//        }
//        int index = 0;
//        int start1 = buff[0];
//        index++;
//        int start2 = buff[1];
//        index++;
//        int start3 = buff[2];
//        index++;
//
//        if (start1 != (byte) 0x44 || start2 != (byte) 0x4E || start3 != (byte) 0x59) {
//            System.out.println("协议头不对");
//            return ;
//        }
//        //获取长度 长度=物理ID+消息ID+命令+数据(n) +校验(2)，每包最多256字节
//        int length = BikeByteUtils.bytes2ToInt(new byte[]{buff[3], buff[4]});
//        System.out.println("数据长度={}"+length);
//        if (length > buff.length) {
//            System.out.println("协议长度不对");
//            buff = null;
//            return;
//        }
//        index += 2;
////                注8、物理ID的编码规则：十六进制的设备编号是小端模式，首先转换成大端模式，最前一个字节是设备识别码，后3个字节是设备编号，
////                设备编号直接转换成十进制就是二维码下方的编号了。比如二维码下方的十进制编号是13544000，二维码中的是40aace04，
////                首先小端换成大端后就是04ceaa40，04就是识别码，ceaa40转换成十进制就是13544000。
////                识别码：03=单路插座，04=双路插座，05=10路充电桩，06=16路充电桩，07=12路充电桩，09=主机，0A=漏保主机
//        byte[] phyId = BikeByteUtils.convertEndian(new byte[]{buff[5], buff[6], buff[7], buff[8]});
//        index += 4;
//        //识别码
//        int idCode = phyId[0];
//        System.out.println("识别码={}"+idCode);
//        //二维码编号
//        int qrCode = Integer.parseInt(ByteBufUtil.hexDump(new byte[]{phyId[1], phyId[2], phyId[3]}), 16);
//        System.out.println("二维码={}"+qrCode);
//        //消息id
//        int msgId =  BikeByteUtils.bytes2ToInt(new byte[]{buff[9], buff[10]});
//        index += 2;
//        //命令
//        int cmd = buff[11];
//        index += 1;
//        //消息体
//        byte [] data = new byte[length - 4-2-1-2];
//        System.arraycopy(buff,index,data,0,data.length);
//        //校验码
//        index += data.length;
//        byte [] tmp = new byte[]{buff[index++], buff[index]};
//        System.out.println("校验结果获取："+ByteBufUtil.hexDump(tmp));
//        int check = BikeByteUtils.bytes2ToInt(tmp);
//        //注3、校验：整个数据包中的每个字节（不包括校验字段本身），将它们的数值累加起来。然后取累加和的低2字节（16位），作为校验字段的值。
//        //累加和
//        int sum = BikeByteUtils.sumCheck(buff,0,index -2);
//        System.out.println("校验和：" + sum);
//        //低二字节
//        int lowerTwoBytes = sum & 0xFFFF;
//        if(lowerTwoBytes != check){
//            System.out.println( "报文检验不通过，报文校验值:" + check + ",后台计算值：" + lowerTwoBytes + "");
//            return ;
//        }
//        System.out.println("解析成功");
//        System.out.println("识别码：" + idCode);
//        System.out.println("QrCode" + qrCode);
//        System.out.println("命令"+ cmd);
//        System.out.println("数据" + ByteBufUtil.hexDump(data));
    }

}
